package com.gjy.scala

object ObjectOriented {
  def main(args: Array[String]): Unit = {
    val person: AccessPerson = new AccessPerson()
    //    println(person.idCard) // 因为是private，所以访问不到
    //    println(person.name)  // 因为受保护，所以也访问不到
    println(person.sex)
    println(person.age) // 可以访问到，因为private后面增加了开放给Demo3_accessible的权限
    person.printInfo()
  }
}


// 伴生对象，伴生对象可以理解为就是 AccessPerson 的一个单例对象
object AccessPerson {
  def main(args: Array[String]): Unit = {
    val person: AccessPerson = new AccessPerson()
    println(person.idCard)
    println(person.name)
    println(person.sex)
    person.printInfo()

  }
}


class AccessPerson {
  private var idCard: String = "123456"
  protected var name: String = "zhangsan"
  var sex: String = "male" //没有修饰符，默认是public
  // 权限修饰符后面，可以增加权限开放的范围
  private[scala] var age:Int = 18

  def printInfo(): Unit = {
    println(s"Person: $idCard $name $sex") //在类的内部，所有修饰符修饰的成员都可以直接访问
  }

}

class Student extends AccessPerson{
  override def printInfo(): Unit = {
    // idCard访问不到，因为private只能在类的内部访问，子类也不允许访问
    //    println(s"Person: $idCard $name $sex")
    println(s"Person: $name $sex")
  }

}
